package com.candoit.webapps.pricing.controllers;

import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.el.ValueExpression;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.component.html.HtmlInputText;
import javax.faces.component.html.HtmlPanelGrid;
import javax.faces.component.html.HtmlPanelGroup;
import javax.faces.context.FacesContext;

import com.candoit.webapps.pricing.model.Formato;
import com.candoit.webapps.pricing.model.Linea;
import com.candoit.webapps.pricing.model.Medida;
import com.candoit.webapps.pricing.util.LineaRentabilidadUtil;
import com.candoit.webapps.pricing.util.QueryUtil;
import com.candoit.webapps.pricing.util.RentabilidadUtil;


@ManagedBean(name = "rentabilidadCtrl")
@SessionScoped
public class RentabilidadFormatoController extends AbstractController {
	
	private HtmlPanelGroup panelFormatos;
	
	private List<Formato> formatos;
	
	private List<Linea> lineas;
	
	private Map<String, Formato> mapFormLinea;
	
	private List<Medida> medidas;
	
	private List<RentabilidadUtil> listUtils;
	
	private Map<String, LineaRentabilidadUtil> mapUtil;
	
	private Map<Integer, Linea> mapLineas;
	
	private Map<Integer, Double> rentabilidadLineas;

	public List<Formato> getFormatos() {
		return formatos;
	}

	public void setFormatos(List<Formato> formatos) {
		this.formatos = formatos;
	}
	
	public List<Linea> getLineas() {
		return lineas;
	}

	public void setLineas(List<Linea> lineas) {
		this.lineas = lineas;
	}
	
	

	public List<RentabilidadUtil> getListUtils() {
		return listUtils;
	}

	public void setListUtils(List<RentabilidadUtil> listUtils) {
		this.listUtils = listUtils;
	}

	public void saveRentabilidad(){
		for (Linea linea : lineas){
			Linea lineaActual = mapLineas.get(linea.getId());
			this.update(lineaActual);
		}
		
		for (RentabilidadUtil util :listUtils){
			for(LineaRentabilidadUtil linea : util.getLineas()){
				if (mapFormLinea.containsKey(String.valueOf(util.getMedida().getId()) + String.valueOf(linea.getLinea().getId()))){
					Formato formato = mapFormLinea.get(String.valueOf(util.getMedida().getId()) + String.valueOf(linea.getLinea().getId()));
					if (rentabilidadLineas.get(linea.getLinea().getId()).doubleValue() == linea.getLinea().getRentabilidad().doubleValue()){	
						formato.setRentabilidad(linea.getRentabilidad());
					}else{
						formato.setRentabilidad(linea.getLinea().getRentabilidad());
					}
					this.update(formato);
				}
			}
		}
		
		this.fillTablas();
		this.fillPanel();
		FacesContext.getCurrentInstance().renderResponse();
		try {
			FacesContext.getCurrentInstance().getExternalContext().redirect("rentabilidad-formatos.jsf");
		} catch (IOException e) {
			e.printStackTrace();
		}	
		
		
	}

	public HtmlPanelGroup getPanelFormatos() {
		if (panelFormatos == null){
			this.fillTablas();
			this.fillPanel();
		}
		return panelFormatos;
	}

	public void setPanelFormatos(HtmlPanelGroup panelFormatos) {
		this.panelFormatos = panelFormatos;
	}
	
	public Map<String, LineaRentabilidadUtil> getMapUtil() {
		return mapUtil;
	}

	public void setMapUtil(Map<String, LineaRentabilidadUtil> mapUtil) {
		this.mapUtil = mapUtil;
	}
	
	public Map<Integer, Linea> getMapLineas() {
		return mapLineas;
	}

	public void setMapLineas(Map<Integer, Linea> mapLineas) {
		this.mapLineas = mapLineas;
	}

	private void fillTablas(){
		listUtils = new ArrayList<RentabilidadUtil>();
		formatos = QueryUtil.getInstance().getFormatos();
		lineas = QueryUtil.getInstance().getLineas();
		mapFormLinea = new HashMap<String, Formato>();
		medidas = QueryUtil.getInstance().getMedidas();
		mapUtil = new HashMap<String, LineaRentabilidadUtil>();
		mapLineas = new HashMap<Integer, Linea>();
		rentabilidadLineas = new HashMap<Integer, Double>();
		for (Medida medida : medidas){
			RentabilidadUtil util = new RentabilidadUtil();
			util.setMedida(medida);
			for(Linea linea: lineas){
				LineaRentabilidadUtil utilLinea = new LineaRentabilidadUtil();
				utilLinea.setLinea(linea);
				rentabilidadLineas.put(linea.getId(), linea.getRentabilidad());
				Formato formato = QueryUtil.getInstance().getFormatoByMedidaAndLinea(medida, linea);
				if (formato != null){
					utilLinea.setRentabilidad(formato.getRentabilidad());
				}else{
					utilLinea.setRentabilidad(0.00d);
				}
				if (!mapLineas.containsKey(linea.getId())){
					mapLineas.put(linea.getId(), linea);
				}
				
				mapUtil.put(String.valueOf(medida.getId()) + String.valueOf(linea.getId()) , utilLinea);
				
				util.getLineas().add(utilLinea);
			}
			
			listUtils.add(util);
		}
		
		for (Formato formato : formatos){
			if (formato.getLinea() != null){
				mapFormLinea.put(String.valueOf(formato.getMedida().getId()) + String.valueOf(formato.getLinea().getId()) , formato);
			}
		}
	}
	
	public Map<String, Formato> getMapFormLinea() {
		return mapFormLinea;
	}

	public void setMapFormLinea(Map<String, Formato> mapFormLinea) {
		this.mapFormLinea = mapFormLinea;
	}

	public List<Medida> getMedidas() {
		return medidas;
	}

	public void setMedidas(List<Medida> medidas) {
		this.medidas = medidas;
	}

	private ValueExpression createValueExpression(String valueExpression,
            Class<?> valueType) {
		 FacesContext facesContext = FacesContext.getCurrentInstance();
	        return facesContext.getApplication().getExpressionFactory().createValueExpression(
	                facesContext.getELContext(), valueExpression, valueType);
	}
	
	private void fillPanel(){
		String clasesColumn = "even";
		for (int i = 0; i < lineas.size(); i++) {
			clasesColumn += ", even";
		}
		
//		HtmlDataTable dynamicDataTable = new HtmlDataTable();
//      	dynamicDataTable.setColumnClasses(clasesColumn);
//	    dynamicDataTable.setHeaderClass("heading");
//	    dynamicDataTable.setStyleClass("mainTable");
//		dynamicDataTable.setValueExpression("value",createValueExpression("#{rentabilidadCtrl.listUtils}", List.class));
//		dynamicDataTable.setVar("item");
//	    HtmlColumn column = new HtmlColumn();
//	    HtmlOutputText header = new HtmlOutputText();
//	    header.setValue("Formato");
//	    column.setHeader(header);
//	    HtmlOutputText formatoOtuput = new HtmlOutputText();
//	    formatoOtuput.setValueExpression("value", createValueExpression("#{item.medida.descripcionMsg}",String.class));
//	    column.getChildren().add(formatoOtuput);
//	    dynamicDataTable.getChildren().add(column);
//	    
//	    for(Linea linea : lineas){
//	     	HtmlColumn columnLinea = new HtmlColumn();
//	     	HtmlPanelGrid panelGrid = new HtmlPanelGrid();
//	     	panelGrid.setColumns(1);
//         	HtmlOutputText headerLinea = new HtmlOutputText();
//         	headerLinea.setValue(linea.getNombre());
//         	panelGrid.getChildren().add(headerLinea);
//         	HtmlInputText lineaRentablidad = new HtmlInputText();
//         	lineaRentablidad.setValueExpression("value", createValueExpression("#{rentabilidadCtrl.getLineaById(" +  linea.getId() +").rentabilidad}",Double.class));
//         	lineaRentablidad.setSize(5);
//         	lineaRentablidad.setStyle("text-align: center;");
//         	panelGrid.getChildren().add(lineaRentablidad);
//         	columnLinea.setHeader(panelGrid);
//         	HtmlInputText rentabilidad = new HtmlInputText();
// 	        rentabilidad.setValueExpression("value", createValueExpression("#{rentabilidadCtrl.getFormatoLinea(item, " +  linea.getId() +").rentabilidad}",Double.class));
// 	        rentabilidad.setSize(5);
// 	        rentabilidad.setStyle("text-align: center;");
// 	        rentabilidad.setDisabled(false);
// 	       rentabilidad.
// 	        columnLinea.getChildren().add(rentabilidad); 
          
// 	       HtmlInputText rentabilidadDisabled = new HtmlInputText();
// 	       rentabilidadDisabled.setValueExpression("value", createValueExpression("#{rentabilidadCtrl.getFormatoLinea(item, " +  linea.getId() +").rentabilidad}",Double.class));
// 	       rentabilidadDisabled.setSize(5);
// 	       rentabilidadDisabled.setStyle("text-align: center;");
// 	       rentabilidadDisabled.setDisabled(true);
// 	        columnLinea.getChildren().add(rentabilidadDisabled); 
// 	        dynamicDataTable.getChildren().add(columnLinea);
//	    }
		
		HtmlPanelGrid panelGrid = new HtmlPanelGrid();
		panelGrid.setColumns(lineas.size() + 1 );
		 HtmlInputText headerFormato = new HtmlInputText();
		 headerFormato.setValue("Formato");
		 headerFormato.setStyleClass("headingPanelGrid");
		 headerFormato.setDisabled(true);
		 headerFormato.setSize(15);
		 panelGrid.getChildren().add(headerFormato);
		 panelGrid.setColumnClasses("even");
		 panelGrid.setHeaderClass("headingPanelGrid");
		 panelGrid.setStyleClass("mainPanelGrid");
		 for(Linea linea : lineas){
			 HtmlInputText headerLinea = new HtmlInputText();
			 headerLinea.setValue(linea.getNombre());
			 headerLinea.setDisabled(true);
			 headerLinea.setSize(15);
			 headerLinea.setStyleClass("headingPanelGrid");
			 panelGrid.getChildren().add(headerLinea);
	     }
		
		 HtmlInputText headerFormato2 = new HtmlInputText();
		 headerFormato2.setValue("");
		 headerFormato2.setDisabled(true);
		 headerFormato2.setSize(15);
		 headerFormato2.setStyleClass("headingPanelGrid");
		 panelGrid.getChildren().add(headerFormato2);
		 for(Linea linea : lineas){
			 HtmlInputText lineaRentablidad = new HtmlInputText();
	         lineaRentablidad.setValueExpression("value", createValueExpression("#{rentabilidadCtrl.getLineaById(" +  linea.getId() +").rentabilidad}",Double.class));
	         lineaRentablidad.setSize(15);
	         lineaRentablidad.setStyle("text-align: center;");
	         lineaRentablidad.setStyleClass("headingInputPanelGrid");
	         panelGrid.getChildren().add(lineaRentablidad);
		 }
		 
		 for (RentabilidadUtil util : listUtils){
			 HtmlInputText medida = new HtmlInputText();
			 medida.setValue(util.getMedida().getDescripcionMsg());
			 medida.setStyleClass("evenHeadingPanelGrid");
			 medida.setSize(15);
			 medida.setDisabled(true);
			 panelGrid.getChildren().add(medida);
			 for (LineaRentabilidadUtil linea : util.getLineas()){
				 HtmlInputText lineaRentablidad = new HtmlInputText();
				 lineaRentablidad.setValue(linea.getRentabilidad());
				 lineaRentablidad.setValueExpression("value", createValueExpression("#{rentabilidadCtrl.getFormatoLinea(" + String.valueOf(util.getMedida().getId()) + String.valueOf(linea.getLinea().getId())+").rentabilidad}", Double.class));
				 lineaRentablidad.setValue(mapUtil.get(String.valueOf(util.getMedida().getId()) + String.valueOf(linea.getLinea().getId())).getRentabilidad());
				 lineaRentablidad.setSize(15);
				 //				 lineaRentablidad.setStyle("text-align: center;");
				 if (linea.getRentabilidad() == 0.00d){
					 lineaRentablidad.setDisabled(true);
					 lineaRentablidad.setStyleClass("evenInputHeadingPanelGridDisabled");
				 }else{
					 lineaRentablidad.setStyleClass("evenInputHeadingPanelGrid");
				 }
				 panelGrid.getChildren().add(lineaRentablidad);
			 }
		 }
	    
	    panelFormatos = new HtmlPanelGroup();
	    panelFormatos.getChildren().add(panelGrid);
	}
	
	
	public boolean existsLineaFormato(Formato formato, Integer idLinea){
		return mapFormLinea.containsKey(String.valueOf(formato.getId()) + String.valueOf(idLinea));
	}
	
//	public LineaRentabilidadUtil getFormatoLinea(RentabilidadUtil medida, Integer idLinea){
//		return mapUtil.get(String.valueOf(medida.getMedida().getId()) + String.valueOf(idLinea));
//	}
	
	public LineaRentabilidadUtil getFormatoLinea(String id){
	return mapUtil.get(id);
}
	
	
	public Linea getLineaById(Integer idLinea){
		return mapLineas.get(idLinea);
	}
	
	public void clearData(){
		this.formatos = null;
		this.lineas = null;
		this.listUtils = null;
		this.mapFormLinea = null;
		this.mapLineas = null;
		this.mapUtil = null;
		this.medidas = null;
		this.panelFormatos = null;
	}

}
